package main

import (
	"fmt"
	"strings"
)

func addUpper() func(int) int {
	var n int = 10
	return func(x int) int {
		n = n + x
		return n
	}
}

func main() {
	//返回的是一个匿名函数，但是这个匿名函数引用到函数外的n，因此这个匿名函数就和n形成一个整体，构成闭包
	//可以理解：闭包就是类，函数就是操作，n是字段。函数和它使用到n构成闭包
	//当我们反复的调用f函数时，因为n时初始化一次，因此调用一次就进行累计
	//我们要搞清楚闭包的关键，就是要分析出返回的函数它使用（引用）到哪些变量，因为函数和它引用到的变量共同构成闭包
	f := addUpper()
	fmt.Println(f(1))
	fmt.Println(f(2))

	println(judgementImageSuffix(".jpg")("1.jpg"))
}

func judgementImageSuffix(suf string) func(fileName string) string {
	return func(fileName string) string {
		if strings.HasSuffix(fileName, suf) {
			return fileName
		}
		return fileName + suf
	}
}
